]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
misc: add code to use settings-daemon smartcard service
authorRay Strode <rstrode@redhat.com>
Thu, 30 May 2013 14:18:51 +0000 (10:18 -0400)
committerRay Strode <rstrode@redhat.com>
Mon, 19 Aug 2013 01:22:42 +0000 (21:22 -0400)
gnome-settings-daemon monitors smartcard insertion and removal
events on the system and then exports a model of the current
smartcard topology over the bus using the D-Bus ObjectManager interface.

This commit adds the support code needed in gnome-shell to talk to
the gnome-settings-daemon service.

A future commit will use this code to inform the login screen
when a user inserts a smartcard (so it can react appropriately)

https://bugzilla.gnome.org/show_bug.cgi?id=683437

js/Makefile.am
js/misc/smartcardManager.js [new file with mode: 0644]

index ea3f44552a378a7418c239da0c67fd32748d5e21..f9a1474c46fddc4c92e74e1e12af16120446b5c9 100644 (file)
@@ -35,6 +35,7 @@ nobase_dist_js_DATA =         \
        misc/modemManager.js    \
        misc/objectManager.js   \
        misc/params.js          \
+       misc/smartcardManager.js \
        misc/util.js            \
        perf/core.js            \
        ui/altTab.js            \
diff --git a/js/misc/smartcardManager.js b/js/misc/smartcardManager.js
new file mode 100644 (file)
index 0000000..644b033
--- /dev/null
@@ -0,0 +1,117 @@
+// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
+
+const Gio = imports.gi.Gio;
+const Lang = imports.lang;
+const Shell = imports.gi.Shell;
+const Signals = imports.signals;
+
+const ObjectManager = imports.misc.objectManager;
+
+const SmartcardTokenIface = <interface name="org.gnome.SettingsDaemon.Smartcard.Token">
+  <property name="Name" type="s" access="read"/>
+  <property name="Driver" type="o" access="read"/>
+  <property name="IsInserted" type="b" access="read"/>
+  <property name="UsedToLogin" type="b" access="read"/>
+</interface>;
+
+let _smartcardManager = null;
+
+function getSmartcardManager() {
+    if (_smartcardManager == null)
+        _smartcardManager = new SmartcardManager();
+
+    return _smartcardManager;
+}
+
+const SmartcardManager = new Lang.Class({
+    Name: 'SmartcardManager',
+    _init: function() {
+        this._objectManager = new ObjectManager.ObjectManager({ connection: Gio.DBus.session,
+                                                                name: "org.gnome.SettingsDaemon.Smartcard",
+                                                                objectPath: '/org/gnome/SettingsDaemon/Smartcard',
+                                                                knownInterfaces: [ SmartcardTokenIface ],
+                                                                onLoaded: Lang.bind(this, this._onLoaded) });
+        this._insertedTokens = {};
+        this._loginToken = null;
+    },
+
+    _onLoaded: function() {
+        let tokens = this._objectManager.getProxiesForInterface('org.gnome.SettingsDaemon.Smartcard.Token');
+
+        for (let i = 0; i < tokens.length; i++)
+            this._addToken(tokens[i]);
+
+        this._objectManager.connect('interface-added', Lang.bind(this, function(objectManager, interfaceName, proxy) {
+            if (interfaceName == 'org.gnome.SettingsDaemon.Smartcard.Token')
+                this._addToken(proxy);
+        }));
+
+        this._objectManager.connect('interface-removed', Lang.bind(this, function(objectManager, interfaceName, proxy) {
+            if (interfaceName == 'org.gnome.SettingsDaemon.Smartcard.Token')
+                this._removeToken(proxy);
+        }));
+    },
+
+    _updateToken: function(token) {
+        let objectPath = token.get_object_path();
+
+        delete this._insertedTokens[objectPath];
+
+        if (token.IsInserted)
+            this._insertedTokens[objectPath] = token;
+
+        if (token.UsedToLogin)
+            this._loginToken = token;
+    },
+
+    _addToken: function(token) {
+        this._updateToken(token);
+
+        token.connect('g-properties-changed',
+                      Lang.bind(this, function(proxy, properties) {
+                          if ('IsInserted' in properties.deep_unpack()) {
+                              this._updateToken(token);
+
+                              if (token.IsInserted) {
+                                  this.emit('smartcard-inserted', token);
+                              } else {
+                                  this.emit('smartcard-removed', token);
+                              }
+                          }
+                      }));
+
+        // Emit a smartcard-inserted at startup if it's already plugged in
+        if (token.IsInserted)
+            this.emit('smartcard-inserted', token);
+    },
+
+    _removeToken: function(token) {
+        let objectPath = token.get_object_path();
+
+        if (this._insertedTokens[objectPath] == token) {
+            delete this._insertedTokens[objectPath];
+            this.emit('smartcard-removed', token);
+        }
+
+        if (this._loginToken == token)
+            this._loginToken = null;
+
+        token.disconnectAll();
+    },
+
+    hasInsertedTokens: function() {
+        return Object.keys(this._insertedTokens).length > 0;
+    },
+
+    hasInsertedLoginToken: function() {
+        if (!this._loginToken)
+            return false;
+
+        if (!this._loginToken.IsInserted)
+            return false;
+
+        return true;
+    }
+
+});
+Signals.addSignalMethods(SmartcardManager.prototype);